const Compiler = require('./Compiler')
const NodeEnvironmentPlugin = require('./NodeEnvironmentPlugin')
const WebpackOptionsApply = require('./WebpackOptionsApply')

const webpack = options => {
  // 实例化一个compiler对象（编译工厂）
  const compiler = new Compiler(options.context)

  // 将options配置参数挂载到compiler.options，以方便将来获取配置参数
  compiler.options = options

  // 让compiler获得读写文件的能力
  new NodeEnvironmentPlugin().apply(compiler)

  // 遍历options配置中的plugins注册监听事件，以便将来某个时刻触发监听来执行插件
  if (options.plugins && Array.isArray(options.plugins)) {
    for (const plugin of options.plugins) {
      plugin.apply(compiler)
    }
  }
  
  // 注册内置插件
  new WebpackOptionsApply().process(options, compiler)

  return compiler
}

module.exports = webpack